/*******************************************************************************
 * Copyright (c) 2008, 2009 Fabio Mauro - Alberto Terraneo.
 * Permission is granted to copy, distribute and/or modify this document
 * under the terms of the GNU Free Documentation License, Version 1.2
 * or any later version published by the Free Software Foundation.
 *     
 * This program is distributed in the hope that it will be useful, 
 * but WITHOUT ANY WARRANTY; without even the implied 
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
 * See the GNU Free Documentation License for more details.
 *     
 * You should have received a copy of the GNU Free Documentation 
 * License along with this distribution; if not, send a email to authors:
 * aterraneo <at> users.sourceforge.net
 * bigmoby09 <at> users.sourceforge.net
 *******************************************************************************/
package it.blueocean.acanto.web.pages.secure.gruppo;

import it.blueocean.acanto.dao.FamigliaDao;
import it.blueocean.acanto.model.Famiglia;
import it.blueocean.acanto.model.Gruppo;
import it.blueocean.acanto.model.constants.StatoGruppo;
import it.blueocean.acanto.service.GruppoService;
import it.blueocean.acanto.web.platform.components.feedback.ValidationStyleBehavior;
import it.blueocean.acanto.web.platform.components.panel.AcantoPanel;

import java.util.ArrayList;
import java.util.List;

import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxFallbackButton;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.markup.html.form.IFormVisitorParticipant;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.util.value.ValueMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class NuovoGruppo extends AcantoPanel
{
	private static final long serialVersionUID = 2022239405641534350L;

	private static final Logger log = LoggerFactory.getLogger(NuovoGruppo.class);
	
	@SpringBean
	private FamigliaDao famigliaDao;
	
	@SpringBean
	private GruppoService gruppoService;
	
	private Label name;
	
	public NuovoGruppo(String id)
	{
		super(id);
		
		name = new Label("name", "nuovo gruppo");
		name.setOutputMarkupId(true);
		add(name);	
		
		add(getComposedForm());
	}
	
	@SuppressWarnings("rawtypes")
	private Component getComposedForm()
	{
		AcantoStandardForm form = new AcantoStandardForm("acantoStandardForm");
		form.setOutputMarkupId(true);
		
		TextField<String> gruppoId = new TextField<String>("gruppoId");
		gruppoId.setRequired(true);
		gruppoId.setOutputMarkupId(true);
		gruppoId.add(new ValidationStyleBehavior());
		form.add(gruppoId);

		TextArea<String> descrizione = new TextArea<String>("descrizione");
		descrizione.setRequired(true);
		descrizione.setOutputMarkupId(true);
		descrizione.add(new ValidationStyleBehavior());
		form.add(descrizione);

		DropDownChoice<Famiglia> referentePrincipale = new DropDownChoice<Famiglia>("referentePrincipale",
				new LoadableDetachableModel<List<Famiglia>>()
				{
					private static final long serialVersionUID = -8189203261004116433L;

					@Override
					protected List<Famiglia> load()
					{
						return getListaFamiglie();
					}

				},
				new ChoiceRenderer<Famiglia>("labelValue", "cdg"));
		referentePrincipale.setRequired(true);
		referentePrincipale.setOutputMarkupId(true);
		referentePrincipale.add(new ValidationStyleBehavior());
		form.add(referentePrincipale);

		DropDownChoice<Famiglia> referenteSostituto = new DropDownChoice<Famiglia>("referenteSostituto",
				new LoadableDetachableModel<List<Famiglia>>()
				{
					private static final long serialVersionUID = -8189203261004116433L;

					@Override
					protected List<Famiglia> load()
					{
						return getListaFamiglie();
					}

				},
				new ChoiceRenderer<Famiglia>("labelValue", "cdg"));
		referenteSostituto.setRequired(true);
		referenteSostituto.add(new ValidationStyleBehavior());
		referenteSostituto.setOutputMarkupId(true);
		form.add(referenteSostituto);

		TextArea<String> note = new TextArea<String>("note");
		note.setOutputMarkupId(true);
		form.add(note);

		DropDownChoice<String> statusComboBox = new DropDownChoice<String>("status", new LoadableDetachableModel<List<String>>()
		{
			private static final long serialVersionUID = 2933800918053929315L;

			@Override
			protected List<String> load()
			{
				return StatoGruppo.getListStringStatiGruppoValues();
			}
		});
		statusComboBox.setRequired(true);
		statusComboBox.add(new ValidationStyleBehavior());
		statusComboBox.setOutputMarkupId(true);
		form.add(statusComboBox);

		form.add(new AjaxFallbackButton("submitButton", form)
		{
			private static final long serialVersionUID = 159710398094370478L;

			@Override
			protected void onSubmit(AjaxRequestTarget target, Form<?> form)
			{
				ValueMap values = (ValueMap) form.getDefaultModelObject();

				String gruppoId = values.getString("gruppoId");
				String descrizione = values.getString("descrizione");
				String note = values.getString("note");
				String status = values.getString("status");
				
				Famiglia referentePrincipale = (Famiglia) values.get("referentePrincipale");
				Famiglia referenteSostituto = (Famiglia) values.get("referenteSostituto");

				log.debug("saving new gruppo");

				Gruppo gruppo = new Gruppo();
				gruppo.setId(gruppoId);
				gruppo.setDescrizione(descrizione);
				gruppo.setNote(note);
				gruppo.setStatus(StatoGruppo.getFromValue(status));
				
				gruppo.setReferentePrincipale(referentePrincipale);
				gruppo.setReferenteSostituto(referenteSostituto);
				
				gruppoService.store(gruppo);

				getSuccessFeedbackModalWindow().show(target);
			}

			@Override
			protected void onError(final AjaxRequestTarget target, Form<?> form)
			{
				form.visitFormComponents(new IVisitor()
				{
					public Object formComponent(IFormVisitorParticipant formVisitor)
					{
						if(formVisitor instanceof FormComponent)
						{
							FormComponent<?> formComponent = (FormComponent<?>) formVisitor;
							target.addComponent(formComponent);
						}
						return formVisitor;
					}
				});

				getErrorFeedbackModalWindow().show(target);
			}
		});
		
		return form;
	}

	private List<Famiglia> getListaFamiglie()
	{
		final List<Famiglia> listFamiglieDTO = new ArrayList<Famiglia>();
		
		List<String> eagerAttributes = new ArrayList<String>();
		eagerAttributes.add("gruppo");
		
		List<Famiglia> listFamiglie = (List<Famiglia>)famigliaDao.findAll(eagerAttributes.toArray(new String[eagerAttributes.size()]));
		
		for (Famiglia famiglia : listFamiglie)
		{
			listFamiglieDTO.add(new Famiglia(famiglia));
		}
		
		return listFamiglieDTO;
	}

}
